/**
 * \file   auxiliar.cpp
 * \author Fabian Jesus Machado
 * \date   Septiembre de 2011
 * 
 *  Este archivo es parte del proyecto NPASM, un ensamblador para
 * microcontroladores PIC con sintaxis Intel, desarrollado inicialmente
 * por Fabian Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 *  El codigo fuente esta diponible en el repositorio SVN de Google:
 *      http://npasm.googlecode.com/svn/trunk.
 * 
 * Septiembre de 2011.
 * 
 */
#include <stdio.h>
#include <stdarg.h>
#include <limits.h>
#include <ctype.h>
#include "auxiliar.h"

using namespace std;

string mkstring(const char *s, ...)
{
	va_list arg;
	va_start(arg, s);
	char buf[0x400];
	vsprintf(buf, s, arg);
	va_end(arg);
	return string(buf);
}

unsigned long int strtoulong(const char *strnum, int base)
{
	unsigned long int n, maximo;
	register unsigned char c;
	const char *s = strnum;

	if(base < 0 || base == 1 || base > 36)
		base = 10;
	else if(base == 16 && s[0] == '0' && toupper(s[1]) == 'X')
		s += 2;
	else if(base == 2 && s[0] == '0' && toupper(s[1]) == 'B')
		s += 2;
	else if(base == 0) {
		if(*s == '0') {
			if(toupper(s[1]) == 'X') {
				s += 2;
				base = 16;
			} else if(toupper(s[1]) == 'B') {
				s += 2;
				base = 2;
			} else
				base = 8;
		} else
			base = 10;
	}

	maximo = ULONG_MAX / (unsigned long int) base;
	n = 0;

	for (c = *s; c != '\0'; c = *++s) {
		if(isdigit(c))
			c -= '0';
		else if(isalpha(c))
			c = toupper(c) - 'A' + 10;
		if(n >= maximo)
			throw(std::string("desbordamiento"));
		n *= (unsigned long int) base;
		n += c;
	}

	return n;
}

int stricmp(const char *s, const char *t)
{
	if(!s)
		return (!t)? 0: -(*t);
	if(!t)
		return *s;
	char c1, c2;
	while((c1 = tolower(*s)) == (c2 = tolower(*t))) {
		if(!*s)
			break;
		++s; ++t;
	}
	return c1 - c2;
}
